function Controller(){
	var Player = require('ui/model/Player');
	var PlayerConstants = require('ui/model/constants/PlayerConstants');
	
	var ws = 'http://192.168.1.39//barriodominationservices/UserServices.svc';
	
	var self = {
		map: null, //Referencia al Mapa
		server: null, //Referencia al Servidor
		conquestPoints: [], //Array con los Puntos de Conquista
		
		
		playerSession: null,
		
		player: null, //Referencia a la Instancia del Jugador
		troops: [], //Array de las Tropas creadas por el Jugador
		commmandCenters: [], //Arrray de los Centros de Comando del Jugador
		
		enemyPlayer: null, //Referencia a la Instancia del Jugador Enemigo
		enemyTroops: [], //Array de las Tropas creadas por el Jugador Enemigo
		enemyCommandCenters: [], //Array de los Centros de Comando del Jugador Enemigo
				
		//Devuelve el ID del Jugador	
		getPlayerID: function(){
			if (this.playerSession != null){
				return this.playerSession.Id;
			}
			else {
				return null;
			}	
		},
		
		//Devuelve el Nombre del Jugador	
		getPlayerName: function(){
			if (this.playerSession != null){
				return this.playerSession.Name;
			}
			else {
				return null;
			};	
		},		
		
		//Devuelve el mayor ID de las Tropas del usuario indicado 
		getMaxIDTroops: function (){
			var maxId = 0;
			
			if (this.troops.length > 0 ){
				
				maxId = this.troops[0].id;
			
				//Recorre el Array de las Tropas para obtener el maximo ID
				for (i = 0; i < this.troops.length; i++){
					if (maxId < this.troops[i].id) {
						maxId = this.troops[i].id;
					}
				}
			}
								 
			return maxId; 
			
		},
		
		getCountTroops: function(){
			
			return this.troops.length;
			
		},
		
		//Agrega una nueva Tropa del Jugador
		//_troop: entidad del tipo TroopView/MotorcycleView/TankView
		//_ownerId: ID del owner de la unidad
		//_ownerLatitude: latitud del owner de la unidad
		//_ownerLongitude: longitud del owner de la unidad
		addTroop: function(_troop, _ownerId, _ownerLatitude, _ownerLongitude){
			
			//Calcula la posición donde se tiene que ubicar la Tropa en el mapa
			var i = 0;
			var k = -1;
			var deltaLatitude = 0;
			var deltaLongitude = 0;
			var delta = 0.001;
			var posicionLibre = true;
			
			if ( this.troops.length > 0) {
				
				//Recorre la lista de Tropas que se encuentran en el mapa
				for (i = 0; i < this.troops.length ; i++){
	
							
					if (this.troops[i].idOwner === _ownerId){
					
						k += 1;
									
						//Obtiene la ubicación inicial de la Tropa.
						//Las tropas se distribuyen de forma radial al rededor del owner (Jugador o Centro de Comando)
						//La posición X,Y de la Tropa se calcula siguiendo una circunferencia de radio R con centro en el owner (Jugador o Centro de Comando)
						deltaLatitude = Math.round(Math.sin((3.14/4)*k))*Math.floor((k/8)+1) * delta;
						deltaLongitude = Math.round(Math.cos((3.14/4)*k))*Math.floor((k/8)+1) * delta;	
				
						posicionLibre = true;
				
						//Recorre todas las Tropas y verifica la posición de las mismas
						for(j = 0; j < this.troops.length ; j++){
					
							//verifica si la tropa de la posición j del array pertenece al owner indicado
							if (this.troops[j].idOwner === _ownerId){
						
								//verifica si la posicion i con respecto al owner se encuentra ocupada
								if(((_ownerLatitude + deltaLatitude) === this.troops[j].latitude) && 
									((_ownerLongitude + deltaLongitude) === this.troops[j].longitude)){
									//si la posicion esta ocupada sale del bucle
									posicionLibre = false;
									break;					
								}
							}
						}
					
					}
				
					if (posicionLibre) {
						//si la posicion esta libre sale del bucle
						break;
					}
				}
				
			}
			else {
				k = 0;
			}
			
			if  (! posicionLibre) {
				k +=1;			
			}
			
			
			//Calcula la posicion de la tropa en funcion de la ubicacion libre detectada
			deltaLatitude = Math.round(Math.sin((3.14/4)*k))*Math.floor((k/8)+1) * delta;
			deltaLongitude = Math.round(Math.cos((3.14/4)*k))*Math.floor((k/8)+1) * delta;
					
			//Asigna la ubicacion a la Tropa
			_troop.setLocation(_ownerLatitude + deltaLatitude, _ownerLongitude + deltaLongitude);
					
			//Agrega la Tropa al Array de Tropas construidas
			this.troops[this.troops.length] = _troop;									
			
			//Agrega la tropa al mapa
			this.map.addElement(_troop);
			
		},
		
		
		//Agrega una Tropo del Enemigo
		addEnemyTroop: function (_enemyTroops){
			//Agrega la Tropa al Array de Tropas construidas
			this.enemyTroops[this.enemyTroops.length] = _enemyTroops;									
			
			//Agrega la tropa al mapa
			this.map.addElement(_enemyTroops);
		},
						
		lifeCycle: function(){
			this.player.lifeCycle();
		},
		
		
		//===============================================
		//WS
		//El el objeto que se conecta contra el servidor
		createServer: function(){
			
			this.server = Ti.Network.createHTTPClient();
			
			
			this.server.onload = function() {
    	
				try{
		
					var jsonDoc = JSON.parse(this.responseText);
    
    				alert(jsonDoc.d.__type);
    				
    				//Codigo para manejar las acciones
    				
    				
    	
				}
				catch(e){
					alert('Error: ' + e.message);
				}
		
			};
		
			
		},
		
		//Inicia la sesion del usuario
		login: function(_params){
			try{
				var serverWS = Ti.Network.createHTTPClient();
		
				serverWS.onload = function() {
    	
					try{
		
						var jsonDoc = JSON.parse(this.responseText);
    				
    					//Codigo para manejar las acciones
    				
    					//Invoca el actionlistener definido en ui\common\LoginView.js
    					Ti.App.fireEvent('loginPlayer', {'user': jsonDoc.d});
    	
					}
					catch(e){
						alert('Error: ' + e.message);
					}
		
				};
				
				
				var wsRequest = ws + '/LoginPlayer';
  				
  				//alert(_params);  				
  					
				serverWS.open('GET', wsRequest);
		
				serverWS.send(_params);
				
		
			}
			catch(e){
				alert(e.message);		
			}
		},
	
		//Establece el oponente
		setOpponent: function(){
			
			if (this.player != null && 
				this.map != null && 
				this.enemyPlayer == null){
			
				var serverWS = Ti.Network.createHTTPClient();
			
				serverWS.onload = function() {
    	
					try{
		
						var jsonDoc = JSON.parse(this.responseText);
    	
    					/* type:  jsonDoc.d.__type
				 		* Id: jsonDoc.d.Id
			 			* Name jsonDoc.d.Name
			 			* Ubicacion: jsonDoc.d.Ubicacion
			 			* Latitud: jsonDoc.d.Ubicacion.Latidud
			 			* Longitud: jsonDoc.d.Ubicacion.Longitud
			 			*/			
			 		
			 			var opponent = jsonDoc.d;
			 		
			 			if ((opponent.Ubicacion.Latitud!= null) &&
			 				(opponent.Ubicacion.Longitud != null)) {
			 			
    						//Crea el oponente
    						var enemyPlayer = new Player(opponent.Id, opponent.Name, opponent.Ubicacion.Latitud, opponent.Ubicacion.Longitud, PlayerConstants.ENEMY);
							
							//Agrega el oponenete al mapa
							self.map.addElement(enemyPlayer);
							
							//Almacena el opononente en el controlador
							self.enemyPlayer = enemyPlayer;
							
							
						}
    				}
					catch(e){
						alert('Error: ' + e.message);
					}
				};
		
				var _params = {
					userName: this.playerSession.Id,   
					latitude: this.playerSession.Ubicacion.Latitud,
					longitude : this.playerSession.Ubicacion.Longitud 
				};
				
				var wsRequest = ws + '/GetOpponentPlayer';
  				serverWS.open('GET', wsRequest);
				serverWS.send(_params);
			}
		},
		
		setPuntosConquista: function(){
			
			if (this.player != null && 
				this.map != null && 
				this.enemyPlayer != null){
			
				var serverWS = Ti.Network.createHTTPClient();
			
				serverWS.onload = function() {
    	
					try{
		
						var jsonDoc = JSON.parse(this.responseText);
    	
    					/* type:  jsonDoc.d.__type
				 		* TipoPunto: jsonDoc.d.TipoPunto
			 			* Ubicacion: jsonDoc.d.Ubicacion
			 			* Latitud: jsonDoc.d.Ubicacion.Latidud
			 			* Longitud: jsonDoc.d.Ubicacion.Longitud
			 			*/			
			 		
			 			var puntosConquista = jsonDoc.d;
			 		
			 			if (puntosConquista.length > 0)  {
			 			
    						//Crea el oponente
    						var enemyPlayer = new Player(opponent.Id, opponent.Name, opponent.Ubicacion.Latitud, opponent.Ubicacion.Longitud, PlayerConstants.ENEMY);
							
							//Agrega el oponenete al mapa
							self.map.addElement(enemyPlayer);
							
							
						}
    				}
					catch(e){
						alert('Error: ' + e.message);
					}
				};
		
				var _params = {
					userName: this.playerSession.Id,   
					latitude: this.playerSession.Ubicacion.Latitud,
					longitude : this.playerSession.Ubicacion.Longitud 
				};
				
				var wsRequest = ws + '/GetOpponentPlayer';
  				serverWS.open('GET', wsRequest);
				serverWS.send(_params);
			}
		}
	
	};
	
	return self;
};

module.exports = Controller;
